package fr.thelem.gestiondemandesthelem.web.actions;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import org.apache.log4j.Logger;

import fr.thelem.gestiondemandesthelem.dao.model.CPDemandeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.MessageEntity;
import fr.thelem.gestiondemandesthelem.service.IAppliService;

/**
 * Action index.
 * 
 */
public class IndexAction extends BaseAction {

    /** Attribut serialVersionUID */
    private static final long serialVersionUID = 3983503107375502628L;

    /** Attribut LOGGER */
    private static Logger LOGGER = Logger.getLogger(IndexAction.class);

    private IAppliService appliService;
    private List<String> listeUtilisateurs;
    private List<String> listeTypeDemandes;
    private List<String> listeEtats;
    private List<CPDemandeEntity> listeDemandes;
    private List<CPDemandeEntity> listeClose;
    private List<String> listeNomDemandes;
    private List<String> allCPDemande = new ArrayList<String>();

    private Map annuler = new HashMap();
    private Map supprimer = new HashMap();

    private String Utilisateur;
    private String nomDemande;
    private String personne;
    private String etat;
    private String type;
    private String date1;
    private String nomcp;
    private String date2;

    /**
     * Affectation de appliService
     * 
     * @param appliService appliService à affecter
     */
    public void setAppliService(IAppliService appliService) {
        this.appliService = appliService;
    }

    /**
     * {@inheritDoc}
     */
    public String execute() throws Exception {
        initialiser();
        Date datedeb = null;
        Date datefin = null;
        listeDemandes = (List<CPDemandeEntity>) appliService.filtrerDemandesParTypeParEtatParPersonneParDate("Aucun choix", type, personne, datedeb, datefin);
        listeClose = (List<CPDemandeEntity>) appliService.filtrerDemandesParTypeParPersonneParDate3Close("Close",  type, personne, datedeb, datefin);

        for (int j=0; j<listeDemandes.size(); j++) {

        	if (listeDemandes.get(j).getEtatCPDemande().getNomEtat().equals("Close")) {
        		listeDemandes.remove(j);
        		System.out.println("tzzzzzzzzzzzz "+ listeDemandes.size());
        	}
        }
        
        /* for (CPDemandeEntity dema : listeClose ) {
        	listeDemandes.add(dema);
        }*/
        return SUCCESS;
    }

    public String filtrerdemandesForm() throws Exception {
        initialiser();
        Date datedeb = null;
        Date datefin = null;
        if (!date1.equalsIgnoreCase("")) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
            sdf.setLenient(false);
            try {
                datedeb = sdf.parse(date1);
                System.out.println(sdf.format(datedeb));
            } catch (Exception e) {
                date1 = "";
                this.addFieldError("DateError1", getText("MonAffichage.label.erreur.date"));
            }
        }
        if (!date2.equalsIgnoreCase("")) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
            sdf.setLenient(false);
            try {
                datefin = sdf.parse(date2);
            } catch (Exception e) {
                date2 = "";
                this.addFieldError("DateError2", getText("MonAffichage.label.erreur.date"));
            }
        }
        if (type != null | etat != null | personne != null | datedeb != null | datefin != null) {
            listeDemandes = (List<CPDemandeEntity>) appliService.filtrerDemandesParTypeParEtatParPersonneParDate(etat, type, personne, datedeb, datefin);
        } else {
            listeDemandes = (List<CPDemandeEntity>) appliService.recupererDemande();
        }
        return SUCCESS;
    }

    public String traitementDemande() throws Exception {
        for (Iterator i = annuler.keySet().iterator(); i.hasNext();) {
            int idDemande = Integer.valueOf((String) i.next());
            appliService.modifierEtatDemande(idDemande, "Annulée");
            appliService.modifierDateDernierEtatDemande(idDemande);
        }

        for (Iterator i = supprimer.keySet().iterator(); i.hasNext();) {
            int idDemande = Integer.valueOf((String) i.next());
            appliService.supprimerDemande(idDemande);
        }

        initialiser();
        listeDemandes = (List<CPDemandeEntity>) appliService.recupererDemande();
        return SUCCESS;
    }

    public String recupererDemandesAutoComplete() throws Exception {
        for (String d : appliService.recupererAllCPDemande()) {
            allCPDemande.add(d);
        }
        return SUCCESS;
    }

    public String recherchedemandesForm() throws Exception {
        initialiser();
        listeDemandes = (List<CPDemandeEntity>) appliService.rechercherDemandeParNom(nomcp);
        return SUCCESS;
    }

    public String consultationForm() throws Exception {
        return SUCCESS;
    }

    private void initialiser() {
        this.ajouterRoleSession();
        MessageEntity message = null;
        try {
            message = appliService.recupererDernierMessage();
        } catch (Exception e) {
            addActionError("Il n'y a pas d'informations en ce moment...");
        }
        this.ajouterValeurSession("infos", message);
        listeTypeDemandes = new ArrayList<String>();
        listeTypeDemandes.add("Aucun choix");
        listeTypeDemandes.addAll(appliService.recupererType());

        listeEtats = new ArrayList<String>();
        listeEtats.add("Aucun choix");
        listeEtats.addAll(appliService.recupererEtat());

        listeUtilisateurs = new ArrayList<String>();
        listeUtilisateurs.add("Aucun choix");
        listeUtilisateurs.addAll(appliService.recupererUtilisateursNom());
    }

    /**
     * Accesseur de appliService
     * 
     * @return le appliService
     */
    public IAppliService getAppliService() {
        return appliService;
    }

    /**
     * Accesseur de listeUtilisateurs
     * 
     * @return le listeUtilisateurs
     */
    public List<String> getListeUtilisateurs() {
        return listeUtilisateurs;
    }

    /**
     * Accesseur de listeTypeDemandes
     * 
     * @return le listeTypeDemandes
     */
    public List<String> getListeTypeDemandes() {
        return listeTypeDemandes;
    }

    /**
     * Accesseur de listeEtats
     * 
     * @return le listeEtats
     */
    public List<String> getListeEtats() {
        return listeEtats;
    }

    /**
     * Accesseur de listeDemandes
     * 
     * @return le listeDemandes
     */
    public List<CPDemandeEntity> getListeDemandes() {
        return listeDemandes;
    }

    /**
     * Accesseur de listeNomDemandes
     * 
     * @return le listeNomDemandes
     */
    public List<String> getListeNomDemandes() {
        return listeNomDemandes;
    }

    /**
     * Affectation de listeUtilisateurs
     * 
     * @param listeUtilisateurs listeUtilisateurs à affecter
     */
    public void setListeUtilisateurs(List<String> listeUtilisateurs) {
        this.listeUtilisateurs = listeUtilisateurs;
    }

    /**
     * Affectation de listeTypeDemandes
     * 
     * @param listeTypeDemandes listeTypeDemandes à affecter
     */
    public void setListeTypeDemandes(List<String> listeTypeDemandes) {
        this.listeTypeDemandes = listeTypeDemandes;
    }

    /**
     * Affectation de listeEtats
     * 
     * @param listeEtats listeEtats à affecter
     */
    public void setListeEtats(List<String> listeEtats) {
        this.listeEtats = listeEtats;
    }

    /**
     * Affectation de listeDemandes
     * 
     * @param listeDemandes listeDemandes à affecter
     */
    public void setListeDemandes(List<CPDemandeEntity> listeDemandes) {
        this.listeDemandes = listeDemandes;
    }

    /**
     * Affectation de listeNomDemandes
     * 
     * @param listeNomDemandes listeNomDemandes à affecter
     */
    public void setListeNomDemandes(List<String> listeNomDemandes) {
        this.listeNomDemandes = listeNomDemandes;
    }

    /**
     * Accesseur de annuler
     * 
     * @return le annuler
     */
    public Map getAnnuler() {
        return annuler;
    }

    /**
     * Accesseur de supprimer
     * 
     * @return le supprimer
     */
    public Map getSupprimer() {
        return supprimer;
    }

    /**
     * Accesseur de utilisateur
     * 
     * @return le utilisateur
     */
    public String getUtilisateur() {
        return Utilisateur;
    }

    /**
     * Accesseur de nomDemande
     * 
     * @return le nomDemande
     */
    public String getNomDemande() {
        return nomDemande;
    }

    /**
     * Accesseur de personne
     * 
     * @return le personne
     */
    public String getPersonne() {
        return personne;
    }

    /**
     * Accesseur de etat
     * 
     * @return le etat
     */
    public String getEtat() {
        return etat;
    }

    /**
     * Accesseur de type
     * 
     * @return le type
     */
    public String getType() {
        return type;
    }

    /**
     * Accesseur de nomcp
     * 
     * @return le nomcp
     */
    public String getNomcp() {
        return nomcp;
    }

    /**
     * Affectation de annuler
     * 
     * @param annuler annuler à affecter
     */
    public void setAnnuler(Map annuler) {
        this.annuler = annuler;
    }

    /**
     * Affectation de supprimer
     * 
     * @param supprimer supprimer à affecter
     */
    public void setSupprimer(Map supprimer) {
        this.supprimer = supprimer;
    }

    /**
     * Affectation de utilisateur
     * 
     * @param utilisateur utilisateur à affecter
     */
    public void setUtilisateur(String utilisateur) {
        Utilisateur = utilisateur;
    }

    /**
     * Affectation de nomDemande
     * 
     * @param nomDemande nomDemande à affecter
     */
    public void setNomDemande(String nomDemande) {
        this.nomDemande = nomDemande;
    }

    /**
     * Affectation de personne
     * 
     * @param personne personne à affecter
     */
    public void setPersonne(String personne) {
        this.personne = personne;
    }

    /**
     * Affectation de etat
     * 
     * @param etat etat à affecter
     */
    public void setEtat(String etat) {
        this.etat = etat;
    }

    /**
     * Affectation de type
     * 
     * @param type type à affecter
     */
    public void setType(String type) {
        this.type = type;
    }

    /**
     * Affectation de nomcp
     * 
     * @param nomcp nomcp à affecter
     */
    public void setNomcp(String nomcp) {
        this.nomcp = nomcp;
    }

    /**
     * Affectation de date1
     * 
     * @param date1 date1 à affecter
     */
    public void setDate1(String date1) {
        this.date1 = date1;
    }

    /**
     * Accesseur de date1
     * 
     * @return le date1
     */
    public String getDate1() {
        return date1;
    }

    /**
     * Accesseur de date2
     * 
     * @return le date2
     */
    public String getDate2() {
        return date2;
    }

    /**
     * Affectation de date2
     * 
     * @param date2 date2 à affecter
     */
    public void setDate2(String date2) {
        this.date2 = date2;
    }

    /**
     * Accesseur de allCPDemande
     * 
     * @return le allCPDemande
     */
    public List<String> getAllCPDemande() {
        return allCPDemande;
    }

    /**
     * Affectation de allCPDemande
     * 
     * @param allCPDemande allCPDemande à affecter
     */
    public void setAllCPDemande(List<String> allCPDemande) {
        this.allCPDemande = allCPDemande;
    }

}
